const _ = require('lodash')

function toCamel(name){
    return name.replace(/_([a-z])/g,($0,$1)=>$1.toUpperCase()).replace(/^[A-Z]/,$0=>$0.toLowerCase())
}
function toPasic(name){
    return toCamel(name).replace(/^[a-z]/,$0=>$0.toUpperCase())
}
function  toUnder(name){
    return name.replace(/[A-Z]/g,($0,$1)=>"_"+$0.toLowerCase()).replace(/^_/,"").toLowerCase()
}
function deepClone(obj,handler){
    if(handler){
        return JSON.parse(JSON.stringify(obj,handler))

    }
    return JSON.parse(JSON.stringify(obj))
}

/**
 * 支持深度克隆，并使用模式匹配进行属性替换
 * @param {源数据} origin 
 * @param {上下文} context 
 * @returns 
 */
function deepPattenClone(origin,context){
    const petten = /<{([\w\s\.]*)}>/g
    return  deepClone(origin,(k,v)=>{
        if(typeof(v)==='string' && petten.test(v)){
            return v.replace(petten,($0,$1)=>{
                return _.get(context,$1.trim())
            })
        }
        return v
    })
}
/**
 * 深度递归遍历一个对象
 * @param {数据} data 
 * @param {处理函数} handler 
 */
function deepEach(data,handler) {
    // 如果 data 是数组
    if (Array.isArray(data)) {
        for (let i = 0; i < data.length; i++) {
            // 递归调用自身处理数组的每个元素
            deepEach(data[i],handler);
        }
    } 
    // 如果 data 是对象
    else if (typeof data === 'object' && data!== null) {
        for (let key in data) {
            if (data.hasOwnProperty(key)) {
                // 递归调用自身处理对象的每个属性值
                deepEach(data[key],handler);
            }
        }
    } 
    // 如果 data 既不是数组也不是对象
    else {
        handler(data);
    }
}
module.exports = {
    toUnder,
    toCamel,
    toPasic,
    deepClone,
    deepEach,
    deepPattenClone,
    getProperty(context,handler,dft=undefined){
        try {
            const result = handler(context)
            if(result===undefined){
                return dft
            }
            return result
        } catch (error) {
            console.error(error)
            return dft
        }
    },
    setDeepProperty(context,path,key,value){
        try {
            const getter = new Function('ctx',`return ctx.${path}`)
            const obj =  getter(context)
            obj[key]=value
            return true
        } catch (error) {
            console.error(error)
            return false
        }
    },
    setProperty(context,handler){
        try {
            handler(context)
            return true
        } catch (error) {
            console.error(error)
            return false
        }
    },
    assert(condition,message){
        if(!condition){
            throw message
        }
    },
    each(obj,cb){
        if(!obj){
            console.error(`迭代的对象不能为空！`)
        }
        if(!cb){
            console.error(`迭代处理器不能为空`)
        }
        Object.keys(obj).forEach(k=>cb(obj[k],k))
    }
}